From: Olivier Fourdan Date: Tue, 28 Mar 2017 09:10:05 +0000 (+0200) Subject: gdkwindow: different displays, different classes X-Git-Tag: archive/raspbian/3.24.39-1+rpi1~1^2~65^2~39^2~639 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=efbe40214b5d670c3a3bbd2d674fe27285d2f346;p=gtk%2B3.0.git gdkwindow: different displays, different classes GdkWindow's before_process_all_updates() and after_process_all_updates() wrongly assume that all displays are from the same class, which is not the case if for example a client open different displays with different backends such as X11 and Wayland. Use the actual class for each display in the display list to avoid a crash when mixing displays from different classes. Fix suggested by Christian Persch in bug #776472. https://bugzilla.gnome.org/show_bug.cgi?id=776472 --- diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index ac3229f53c..689d666100 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -4024,12 +4024,10 @@ static void before_process_all_updates (void) { GSList *displays, *l; - GdkDisplayClass *display_class; displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); - display_class = GDK_DISPLAY_GET_CLASS (displays->data); for (l = displays; l; l = l->next) - display_class->before_process_all_updates (l->data); + GDK_DISPLAY_GET_CLASS (l->data)->before_process_all_updates (l->data); g_slist_free (displays); } @@ -4038,12 +4036,10 @@ static void after_process_all_updates (void) { GSList *displays, *l; - GdkDisplayClass *display_class; displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); - display_class = GDK_DISPLAY_GET_CLASS (displays->data); for (l = displays; l; l = l->next) - display_class->after_process_all_updates (l->data); + GDK_DISPLAY_GET_CLASS (l->data)->after_process_all_updates (l->data); g_slist_free (displays); }